#pragma once

#include <iostream>
#include <vector>
#include <sstream>
#include <curl/curl.h>

// 回调函数声明（用于接收响应）
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* s);

class CurlClient {
public:
    // 构造函数初始化curl句柄
    CurlClient();
    // 析构函数清理资源
    ~CurlClient();

    // 禁用拷贝构造和赋值（避免curl句柄重复释放）
    CurlClient(const CurlClient&) = delete;
    CurlClient& operator=(const CurlClient&) = delete;

    // 设置请求URL
    void setUrl(const std::string& url) { m_url = url; }

    // 设置超时时间（秒）
    void setTimeOut(long timeout) { m_timeout = timeout; }

    // 启用/禁用HTTPS验证（生产环境建议启用）
    void setSslVerify(bool verify) { m_sslVerify = verify; }

    // 发送JSON数据（核心请求方法）
    bool postJson(const std::string& json_data);

    // 获取最近一次响应内容
    std::string getResponse() const { return m_response; }

    // 获取最近一次错误信息
    std::string getError() const { return m_error; }

    // 获取HTTP状态码
    long getHttpCode() const { return m_httpCode; }

private:
    // 全局初始化curl（线程安全）
    static void globalInit();

    CURL* m_curl = nullptr;               // curl句柄
    std::string m_url;                    // 请求URL
    std::string m_response;               // 响应内容
    std::string m_error;                  // 错误信息
    long m_timeout = 1;                   // 超时时间（默认1秒）
    bool m_sslVerify = false;             // 是否验证HTTPS（默认关闭，测试用）
    long m_httpCode = 0;                  // HTTP状态码
    struct curl_slist* m_headers = nullptr; // HTTP头信息

    static std::once_flag s_initFlag;     // 全局初始化标志（确保只执行一次）
};